const Joi = require('joi');

// 获取服务事项列表的查询参数验证规则
const getServiceItemsSchema = Joi.object({
  category_id: Joi.string().max(10).optional().messages({
    'string.max': '分类ID不能超过10个字符'
  }),
  keywords: Joi.string().max(100).optional().allow('').messages({
    'string.max': '搜索关键词不能超过100个字符'
  }),
  is_online: Joi.boolean().optional().messages({
    'boolean.base': '在线办理筛选参数必须是布尔值'
  }),
  is_appointment: Joi.boolean().optional().messages({
    'boolean.base': '可预约筛选参数必须是布尔值'
  }),
  status: Joi.string().valid('active', 'inactive', 'maintenance').optional().default('active').messages({
    'any.only': '状态只能是active、inactive或maintenance'
  }),
  page: Joi.number().integer().min(1).optional().default(1).custom((value, helpers) => {
    // 确保值是有效的整数
    const num = parseInt(value, 10);
    if (isNaN(num) || num !== value) {
      return helpers.error('number.integer');
    }
    return num;
  }).messages({
    'number.base': '页码必须是数字',
    'number.integer': '页码必须是整数',
    'number.min': '页码必须大于0'
  }),
  limit: Joi.number().integer().min(1).max(100).optional().default(50).custom((value, helpers) => {
    // 确保值是有效的整数
    const num = parseInt(value, 10);
    if (isNaN(num) || num !== value) {
      return helpers.error('number.integer');
    }
    return num;
  }).messages({
    'number.base': '每页数量必须是数字',
    'number.integer': '每页数量必须是整数',
    'number.min': '每页数量至少为1',
    'number.max': '每页数量不能超过100'
  }),
  _t: Joi.number().optional().messages({
    'number.base': '时间戳参数必须是数字'
  })
});

// 获取服务分类列表的查询参数验证规则
const getServiceCategoriesSchema = Joi.object({
  status: Joi.string().valid('active', 'inactive').optional().default('active').messages({
    'any.only': '状态只能是active或inactive'
  }),
  include_stats: Joi.boolean().optional().default(false).messages({
    'boolean.base': '是否包含统计信息必须是布尔值'
  }),
  _t: Joi.number().optional().messages({
    'number.base': '时间戳参数必须是数字'
  })
});

// 服务事项ID验证规则
const serviceItemIdSchema = Joi.object({
  id: Joi.string().max(20).required().messages({
    'string.max': '服务事项ID不能超过20个字符',
    'any.required': '服务事项ID不能为空'
  })
});

// 服务分类ID验证规则
const serviceCategoryIdSchema = Joi.object({
  id: Joi.string().max(10).required().messages({
    'string.max': '服务分类ID不能超过10个字符',
    'any.required': '服务分类ID不能为空'
  })
});

// 添加收藏的请求体验证规则
const addFavoriteSchema = Joi.object({
  service_item_id: Joi.string().max(20).required().messages({
    'string.max': '服务事项ID不能超过20个字符',
    'any.required': '服务事项ID不能为空'
  }),
  user_id: Joi.number().integer().min(1).required().messages({
    'number.base': '用户ID必须是数字',
    'number.integer': '用户ID必须是整数',
    'number.min': '用户ID必须大于0',
    'any.required': '用户ID不能为空'
  })
});

// 取消收藏的请求体验证规则
const removeFavoriteSchema = Joi.object({
  service_item_id: Joi.string().max(20).required().messages({
    'string.max': '服务事项ID不能超过20个字符',
    'any.required': '服务事项ID不能为空'
  }),
  user_id: Joi.number().integer().min(1).required().messages({
    'number.base': '用户ID必须是数字',
    'number.integer': '用户ID必须是整数',
    'number.min': '用户ID必须大于0',
    'any.required': '用户ID不能为空'
  })
});

// 获取用户收藏列表的查询参数验证规则
const getUserFavoritesSchema = Joi.object({
  user_id: Joi.number().integer().min(1).required().messages({
    'number.base': '用户ID必须是数字',
    'number.integer': '用户ID必须是整数',
    'number.min': '用户ID必须大于0',
    'any.required': '用户ID不能为空'
  }),
  category_id: Joi.string().max(10).optional().messages({
    'string.max': '分类ID不能超过10个字符'
  }),
  status: Joi.string().valid('active', 'cancelled').optional().default('active').messages({
    'any.only': '状态只能是active或cancelled'
  }),
  page: Joi.number().integer().min(1).optional().default(1).custom((value, helpers) => {
    const num = parseInt(value, 10);
    if (isNaN(num) || num !== value) {
      return helpers.error('number.integer');
    }
    return num;
  }).messages({
    'number.base': '页码必须是数字',
    'number.integer': '页码必须是整数',
    'number.min': '页码必须大于0'
  }),
  limit: Joi.number().integer().min(1).max(100).optional().default(50).custom((value, helpers) => {
    const num = parseInt(value, 10);
    if (isNaN(num) || num !== value) {
      return helpers.error('number.integer');
    }
    return num;
  }).messages({
    'number.base': '每页数量必须是数字',
    'number.integer': '每页数量必须是整数',
    'number.min': '每页数量至少为1',
    'number.max': '每页数量不能超过100'
  }),
  _t: Joi.number().optional().messages({
    'number.base': '时间戳参数必须是数字'
  })
});

// 搜索服务事项的查询参数验证规则
const searchServiceItemsSchema = Joi.object({
  keyword: Joi.string().min(1).max(100).required().messages({
    'string.min': '搜索关键词不能为空',
    'string.max': '搜索关键词不能超过100个字符',
    'any.required': '搜索关键词不能为空'
  }),
  category_id: Joi.string().max(10).optional().messages({
    'string.max': '分类ID不能超过10个字符'
  }),
  is_online: Joi.boolean().optional().messages({
    'boolean.base': '在线办理筛选参数必须是布尔值'
  }),
  is_appointment: Joi.boolean().optional().messages({
    'boolean.base': '可预约筛选参数必须是布尔值'
  }),
  status: Joi.string().valid('active', 'inactive', 'maintenance').optional().default('active').messages({
    'any.only': '状态只能是active、inactive或maintenance'
  }),
  page: Joi.number().integer().min(1).optional().default(1).custom((value, helpers) => {
    const num = parseInt(value, 10);
    if (isNaN(num) || num !== value) {
      return helpers.error('number.integer');
    }
    return num;
  }).messages({
    'number.base': '页码必须是数字',
    'number.integer': '页码必须是整数',
    'number.min': '页码必须大于0'
  }),
  limit: Joi.number().integer().min(1).max(50).optional().default(20).custom((value, helpers) => {
    const num = parseInt(value, 10);
    if (isNaN(num) || num !== value) {
      return helpers.error('number.integer');
    }
    return num;
  }).messages({
    'number.base': '每页数量必须是数字',
    'number.integer': '每页数量必须是整数',
    'number.min': '每页数量至少为1',
    'number.max': '每页数量不能超过50'
  }),
  _t: Joi.number().optional().messages({
    'number.base': '时间戳参数必须是数字'
  })
});

// 获取用户收藏总数的查询参数验证规则
const getUserFavoritesCountSchema = Joi.object({
  user_id: Joi.number().integer().min(1).required().messages({
    'number.base': '用户ID必须是数字',
    'number.integer': '用户ID必须是整数',
    'number.min': '用户ID必须大于0',
    'any.required': '用户ID不能为空'
  }),
  status: Joi.string().valid('active', 'cancelled').optional().default('active').messages({
    'any.only': '状态只能是active或cancelled'
  }),
  _t: Joi.number().optional().messages({
    'number.base': '时间戳参数必须是数字'
  })
});

module.exports = {
  getServiceItemsSchema,
  getServiceCategoriesSchema,
  serviceItemIdSchema,
  serviceCategoryIdSchema,
  addFavoriteSchema,
  removeFavoriteSchema,
  getUserFavoritesSchema,
  searchServiceItemsSchema,
  getUserFavoritesCountSchema
};
